<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
   <title>Animate/ApplyRange フィルタ</title>
   <link rel="stylesheet" type="text/css" href="../../avisynth.css">
   <link rel="stylesheet" type="text/css" href="../ja.css">
</head>
<body>
<h2>
<a NAME="Animate"></a>Animate
/ ApplyRange
</h2>
<p><code>Animate </code>(<var>clip, int start_frame, int end_frame, string filtername,
start_args, end_args</var>)<br>
  <code>ApplyRange </code>(<var>clip, int start_frame, int end_frame, string
filtername, args</var>)
<p><code>Animate</code> は、連続的に変化する実引数を伴った <var>filtername</var> パラメータを評価するメタフィルタです。<var>filtername</var> は、<var>start-frame</var> 以前のフレームでは、<var>start-args</var> によって与えられた実引数を使って評価されます。<var>end-frame</var> 以降のフレームでは、<var>end-args</var> によって与えられた引数を用いて評価されます。それらに挟まれた範囲では、実引数は、スムーズに変化するように線形補間されます。
<p><code>ApplyRange</code> は、<var>start_args</var> が <var>end_args</var> と等しいという特別な場合の <code>Animate</code> フィルタで、<em>v2.51</em> から内蔵されています。あるフィルタをクリップのある範囲のフレームに適用したいときに使用することができます。<code>Animate</code> とのもうひとつの違いは、<var>args</var> が clip を含むことができないということです。<em>v2.53</em> からは音声をサポートしており、<var>start_frame</var> と <var>end_frame</var> を同じ値にすることもできます（1 フレームだけが処理されるような場合）。
<p>たくさんの範囲が同様の処理を必要とする場合、数多くの <code>ApplyRange</code> を呼び出すことは、リソース問題を引き起こすかもしれません。代替案としては、未処理のバージョンのソースと処理されたバージョンのソースとの間で選択するために、<a href="conditionalfilter.htm">ConditionalFilter</a> と一緒に <a href="conditionalreader.htm#ApplyRange">ConditionalReader</a> を使うことが考えられます。
<p><var>filtername</var> は、（string 型なので）二重引用符で囲まなければなりません。そして、2 つの入れ子になった実引数リストは、丸括弧には入れません。文字列とビデオクリップは補間できないので、それらは、2 つの実引数リストにおいて、まったく同一でなければなりません。ただし重要な警告: もし 1 つ目の実引数としてクリップを使用するなら、同じクリップは <var>start_args</var> と <var>end_args</var> に含まれるべきではありません。例えば、次のスクリプト
<pre>v = Version()
Animate(v,0,149,&quot;Crop&quot;, v,0,0,64,32, v,316,0,64,32)</pre>
<p>は、最初のフレームが Crop(v, v, 0, 0, 64, 32) という間違ったシンタックスになるため、エラーを引き起こしてしまいます。
<p>このフィルタは変化する音声トラックを正確に取り扱うことができないため、音声トラックを修正するフィルタとの併用は推奨されません。そしてお願いですから、最初と最後のパラメータが異なる出力フレームサイズをもたらさないようにしてください。
<p>線形補間よりも 2 次補間を望むなら、<var>filtername</var> の実引数を <code>Animate</code> にすることもできます。
<p><b>使用例:</b>
<pre># 「Version」ビデオのスクロール版をつくる:
ver = Version()
Animate(0,149,&quot;Crop&quot;, ver,0,0,64,32, ver,316,0,64,32)

# 上の使用例と同じ:
ver = Version()
Animate(ver,0,149,&quot;Crop&quot;, 0,0,64,32, 316,0,64,32)</pre>

<pre># 白色にフェードアウトする
AviSource(&quot;E:\pdwork\DO-Heaven.AVI&quot;)
Animate(100,200,&quot;Levels&quot;, 0,1,255,0,255, 0,1,255,255,255)</pre>

<pre># フレーム 100 が 1:1 の倍率で始まり、
# フレーム 200 が 4:1 の倍率で終わるように、
# 320x240 のビデオの中心へ次第にズームする:
clip = AviSource(&quot;E:\pdwork\DO-Heaven.avi&quot;)
Animate(100,200,&quot;BicubicResize&quot;,
\   clip,320,240,0,0,320,240,
\   clip,320,240,120,90,80,60)
# Animate(clip, 100,200,&quot;BicubicResize&quot;,
#\   320,240,0,0,320,240,
#\   320,240,120,90,80,60) # これも動作する。</pre>

<pre>

# 「Hello, World!」というテキストを 320x240 のビデオの中心からズームアウトさせる:
BlankClip(width=320, height=240)
Animate(0,48,&quot;Subtitle&quot;, &quot;Hello, World!&quot;,160,120,0,99999,&quot;Arial&quot;,0,
&nbsp; \&nbsp; &quot;Hello, World!&quot;,25,130,0,99999,&quot;Arial&quot;,48)</pre>

<pre># クリップ c2 を c1 の上にオーバーレイさせながらズームする:
Function myfunc(clip c1, clip c2, int x, int y, int w, int h)
{
  w = w - w%2
  h = h - h%2
  my_c2 = BicubicResize(c2,w,h)
  Overlay(c1,my_c2,x,y)
}

c1 = AviSource(&quot;D:\Captures\jewel.avi&quot;) # c1 は c2 より大きい
c2 = AviSource(&quot;D:\Captures\atomic.avi&quot;).BicubicResize(320,240)
Animate(0,1000,&quot;myfunc&quot;,c1,c2,10,10,10,10,c1,c2,300,300,360,288)
# もしくは
# Animate(c1,0,1000,&quot;myfunc&quot;, c2,10,10,10,10, c2,300,300,360,288)

# しかし下記のスクリプトは、myfunc に 3 つのクリップ（c1、c1、および c2）が渡されるが、
# 実際に許可されるのは 2 つのみなので動かない:
# Animate(c1,0,1000,&quot;myfunc&quot;,c1,c2,10,10,10,10,c1,c2,300,300,360,288)</pre>

<pre># メインのクリップに取って代わるまで、小さな写真が黒色のクリップの上で拡大する:
function res(clip clip, clip &quot;LClip&quot;,
\  int &quot;width&quot;, int &quot;height&quot;,
\  int &quot;centerX&quot;, int &quot;centerY&quot;) {
  LClip = BicubicResize(LClip, width, height)
  Overlay(clip, LClip, centerX-LClip.width/2, centerY-LClip.height/2)
}

function resize(clip clip, clip &quot;LClip&quot;,
\  int &quot;start_frame&quot;, int &quot;start_width&quot;, int &quot;start_height&quot;,
\  int &quot;end_frame&quot;,   int &quot;end_width&quot;,   int &quot;end_height&quot;,
\  int &quot;centerX&quot;, int &quot;centerY&quot;)
{
  return Animate(start_frame, end_frame, &quot;res&quot;,
\   clip, LClip, start_width, start_height, centerX, centerY,
\   clip, LClip, end_width,   end_height,   centerX, centerY)
}

clip = AviSource(&quot;D:\captures\jewel.avi&quot;)
clip = clip.BicubicResize(640,480)
clip = clip.ConvertToRGB()
black = BlankClip(clip)

resize(black, clip,
\    0, 120, 120*clip.height/clip.width,
\  500, 640, 480,
\  clip.width/2, clip.height/2)</pre>
<pre>ver = Version()
return ver.ApplyRange(0,149,&quot;Crop&quot;, 158,0,64,32)

AviSource(&quot;E:\pdwork\DO-Heaven.avi&quot;).BicubicResize(320,240)
ApplyRange(0,48,&quot;Subtitle&quot;,&quot;Hello World!&quot;,25,130,0,99999,&quot;Arial&quot;,48)

# 上の使用例と同じ:
clip = AviSource(&quot;E:\pdwork\DO-Heaven.avi&quot;).BicubicResize(320,240)
ApplyRange(clip,0,48,&quot;Subtitle&quot;,&quot;Hello World!&quot;,25,130,0,99999,&quot;Arial&quot;,48)</pre>
<p><kbd>原文 Date: 2008/02/10 13:57:17</kbd><br />
<kbd>日本語訳 $Date: 2008/06/22 07:41:09 $</kbd></p>
<form><input TYPE="Button" VALUE="戻る"
onClick="history.go(-1)"></form>
</body>
</html>
